home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / sndhrdw / m72.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  4KB  |  170 lines

  1. /***************************************************************************
  2.  
  3. IREM "M72" sound hardware
  4.  
  5. used by:
  6.  
  7. Game                          Year  Sound program ID string
  8. ----------------------------  ----  -----------------------
  9. R-Type                        1987  - (earlier version, no sample player)
  10. Battle Chopper / Mr. Heli     1987  Rev 2.20
  11. Vigilante                     1988  Rev 2.20
  12. Ninja Spirit                  1988  Rev 2.20
  13. Image Fight                   1988  Rev 2.20
  14. Legend of Hero Tonma          1989  Rev 2.20
  15. X Multiply                    1989  Rev 2.20
  16. Dragon Breed                  1989  Rev 2.20
  17. Kickle Cubicle                1988  Rev 2.21
  18. Shisensho                     1989  Rev 2.21
  19. R-Type II                     1989  Rev 2.21
  20. Major Title                   1990  Rev 2.21
  21. Air Duel                      1990  Rev 3.14 M72 (no NMI handler)
  22. Daiku no Gensan               1990  Rev 3.14 M81
  23. Hammerin' Harry               1990  Rev 3.15 M81
  24. Ken-Go                          1991  Rev 3.15 M81
  25. Pound for Pound               1990  Rev 3.15 M83 (no NMI handler)
  26. Gallop - Armed Police Unit    1991  Rev 3.15 M72 (no NMI handler)
  27. Bomber Man World              1992  Rev 3.31 M81
  28. Atomic Punk                   1992  Rev 3.31 M99
  29. Quiz F-1 1,2finish            1992  Rev 3.33 M81
  30. Risky Challenge               1993  Rev 3.34 M81
  31. Shisensho II                  1993  Rev 3.34 M81
  32.  
  33. ***************************************************************************/
  34. #include "driver.h"
  35.  
  36.  
  37. /*
  38.  
  39.   The sound CPU runs in interrup mode 0. IRQ is shared by two sources: the
  40.   YM2151 (bit 4 of the vector), and the main CPU (bit 5).
  41.   Since the vector can be changed from different contexts (the YM2151 timer
  42.   callback, the main CPU context, and the sound CPU context), it's important
  43.   to accurately arbitrate the changes to avoid out-of-order execution. We do
  44.   that by handling all vector changes in a single timer callback.
  45.  
  46. */
  47.  
  48.  
  49. enum
  50. {
  51.     VECTOR_INIT,
  52.     YM2151_ASSERT,
  53.     YM2151_CLEAR,
  54.     Z80_ASSERT,
  55.     Z80_CLEAR
  56. };
  57.  
  58. static void setvector_callback(int param)
  59. {
  60.     static int irqvector;
  61.  
  62.     switch(param)
  63.     {
  64.         case VECTOR_INIT:
  65.             irqvector = 0xff;
  66.             break;
  67.  
  68.         case YM2151_ASSERT:
  69.             irqvector &= 0xef;
  70.             break;
  71.  
  72.         case YM2151_CLEAR:
  73.             irqvector |= 0x10;
  74.             break;
  75.  
  76.         case Z80_ASSERT:
  77.             irqvector &= 0xdf;
  78.             break;
  79.  
  80.         case Z80_CLEAR:
  81.             irqvector |= 0x20;
  82.             break;
  83.     }
  84.  
  85.     cpu_irq_line_vector_w(1,0,irqvector);
  86.     if (irqvector == 0xff)    /* no IRQs pending */
  87.         cpu_set_irq_line(1,0,CLEAR_LINE);
  88.     else    /* IRQ pending */
  89.         cpu_set_irq_line(1,0,ASSERT_LINE);
  90. }
  91.  
  92. void m72_init_sound(void)
  93. {
  94.     setvector_callback(VECTOR_INIT);
  95. }
  96.  
  97. void m72_ym2151_irq_handler(int irq)
  98. {
  99.     if (irq)
  100.         timer_set(TIME_NOW,YM2151_ASSERT,setvector_callback);
  101.     else
  102.         timer_set(TIME_NOW,YM2151_CLEAR,setvector_callback);
  103. }
  104.  
  105. WRITE_HANDLER( m72_sound_command_w )
  106. {
  107.     if (offset == 0)
  108.     {
  109.         soundlatch_w(offset,data);
  110.         timer_set(TIME_NOW,Z80_ASSERT,setvector_callback);
  111.     }
  112. }
  113.  
  114. WRITE_HANDLER( m72_sound_irq_ack_w )
  115. {
  116.     timer_set(TIME_NOW,Z80_CLEAR,setvector_callback);
  117. }
  118.  
  119.  
  120.  
  121. static int sample_addr;
  122.  
  123. void m72_set_sample_start(int start)
  124. {
  125.     sample_addr = start;
  126. }
  127.  
  128. WRITE_HANDLER( vigilant_sample_addr_w )
  129. {
  130.     if (offset == 1)
  131.         sample_addr = (sample_addr & 0x00ff) | ((data << 8) & 0xff00);
  132.     else
  133.         sample_addr = (sample_addr & 0xff00) | ((data << 0) & 0x00ff);
  134. }
  135.  
  136. WRITE_HANDLER( shisen_sample_addr_w )
  137. {
  138.     sample_addr >>= 2;
  139.  
  140.     if (offset == 1)
  141.         sample_addr = (sample_addr & 0x00ff) | ((data << 8) & 0xff00);
  142.     else
  143.         sample_addr = (sample_addr & 0xff00) | ((data << 0) & 0x00ff);
  144.  
  145.     sample_addr <<= 2;
  146. }
  147.  
  148. WRITE_HANDLER( rtype2_sample_addr_w )
  149. {
  150.     sample_addr >>= 5;
  151.  
  152.     if (offset == 1)
  153.         sample_addr = (sample_addr & 0x00ff) | ((data << 8) & 0xff00);
  154.     else
  155.         sample_addr = (sample_addr & 0xff00) | ((data << 0) & 0x00ff);
  156.  
  157.     sample_addr <<= 5;
  158. }
  159.  
  160. READ_HANDLER( m72_sample_r )
  161. {
  162.     return memory_region(REGION_SOUND1)[sample_addr];
  163. }
  164.  
  165. WRITE_HANDLER( m72_sample_w )
  166. {
  167.     DAC_signed_data_w(0,data);
  168.     sample_addr = (sample_addr + 1) & (memory_region_length(REGION_SOUND1) - 1);
  169. }
  170.